<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

</body>
<script>
  // 1、Object.prototype.valueOf()
  // 返回指定对象的原始值。默认情况返回对象本身
  var obj = new Object();
  console.log(obj.valueOf() === obj);    //true
  // 用自定义的 Object.valueOf() 覆盖 Object.prototype.valueOf
  obj.valueOf = function () {
    return 2
  }
  console.log(1 + obj);   // 3


  //2、 Object.prototype.toString()
  // 返回对象的字符串表示，默认返回类型字符串
  var obj2 = { a: 1 };
  // 如果没有定制 toString方法得到如下结果
  console.log(obj2.toString());   // [object Object]
  // 自定义了 toString() 方法
  obj2.toString = function () {
    return 'hello';
  }
  console.log(obj2.toString() + ' world');    // hello world

  var arr = [1, 2, 3];
  console.log(arr.toString());    // 1,2,3

  console.log('123'.toString());    // 123

  console.log((function () {
    return 123
  }).toString());

  console.log((new Date()).toString());   // Thu Nov 05 2020 09:06:25 GMT+0800 (中国标准时间)



  // 3、Object.prototype.toLocaleString()
  // 直接调用 toString()方法，根据所在地返回
  console.log((new Date()).toLocaleString());   // 2020/11/5 上午9:08:18




  // 4、Object.prototype.isPrototypeOf()
  // 返回一个布尔值，表示指定的对象是否在本对象的原型链中，用来判断该对象是否是另一个对象的原型。
  var o1 = {};
  var o2 = Object.create(o1);
  var o3 = Object.create(o2);
  console.log(o2.isPrototypeOf(o3));    // true
  console.log(o1.isPrototypeOf(o3));    // true
  console.log(Object.prototype.isPrototypeOf({}));    // true
  console.log(Object.prototype.isPrototypeOf([]));    // true
  console.log(Object.prototype.isPrototypeOf(Object.create(null)));   // false

  // 5、Object.prototype.hasOwnProperty()
  // 返回一个布尔值 ，表示某个对象是否含有指定的属性，而且此属性非原型链继承的。
  var obj3 = {
    a: 123
  }
  console.log(obj3.hasOwnProperty('a'));     // true
  console.log(obj3.hasOwnProperty('b'));    // false
  console.log(obj3.hasOwnProperty('toString'));   // false


  // 6、Object.prototype.propertyIsEnumerable()
  // 判断指定属性是否可枚举


  // 属性描述对象，一个对象内部的数据结构
  var obj4 = {};
  obj4.name = '小笑残虹';
  obj4.name = 'zhangsan';
  console.log(obj4.propertyIsEnumerable('name'));   // true
  console.log(Object.getOwnPropertyDescriptor(obj4, 'name'));
  /* {
    configurable: true
    enumerable: true
    value: "zhangsan"
    writable: true
  } */
  console.log(delete obj4.name);    // true

  /* {
    value:zhangsan,
    writable:true,
    enumerable:true,
    configurable:true,
    set:undefined,
    get:undefined
  } */

  val => val+1;
  function add1(val){
    return val + 1;
  }

</script>

</html>